package lh2;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Permite crear baldes que contienen registros. Cada servidor tendrá
 * un balde.
 * @author Cappetta, Vidal, Aiello
 */
public class Balde {

    private List<Registro> registros;
    int tamañoMaximo;
    /**
     * Permite crear un balde estableciendo el tamaño máximo del mismo
     * @param tamañoMaximo
     */
    public Balde(int tamañoMaximo){
        this.registros=new ArrayList<Registro>();
        this.tamañoMaximo=tamañoMaximo;
    }

    /**
     * Permite agregar un registro al balde, a menos que éste se esté
     * desbordando.
     * @param registro a insertar
     * @return si el balde se desborda o no
     */
    public boolean agregar(Registro reg){
        boolean desborde=false;
        if(this.registros.size()+1<=tamañoMaximo){
            this.registros.add(reg);
        }
        else{
            desborde=true;
        }
        return desborde;
    }

    /**
     * Permite eliminar un registro de un balde dado por su clave.
     * @param clave del registro
     */
    public void eliminar(int clave) {
        for (Registro reg:registros){
            if (reg.clave==clave){
                registros.remove(reg);
            }
        }
    }

    /**
     * Permite recuperar un registro dado por su clave.
     * @param clave
     * @return registro
     */
    public Registro recuperar(int clave) {
        for (Registro reg:registros){
            if (reg.clave==clave){
                return reg;
            }
        }
        return null;
    }

    /**
     * Determina la cantidad de registros en el balde.
     * @return cantidad de registros en el balde.
     */
    public int tamano(){
        return registros.size();
    }


    /**
     * Busca en un balde dada una expresión regular
     * @param regex, una expresión regular
     * @return una lista de registros que cumplen con la regex
     */
    public List<Registro> scan(String regex){
           System.out.println("comenzando a escanear..."+this.registros.size()+" registros");
           List<Registro> listaregistros=new ArrayList<Registro>();
           Pattern patron = Pattern.compile(regex);

           for (Registro reg: this.registros){
               System.out.println("matchea? "+reg.campo+", con: "+regex+"?");
               Matcher match = patron.matcher(reg.campo);
               if (match.matches()){
                   listaregistros.add(reg);
                   System.out.println("el registro "+ reg.campo+", matchea y se agrega para enviar");
               }
           }
           return listaregistros;
    }

    /**
     *
     * @return
     */
    public List<Registro> clonarRegistros()
    {
        List<Registro> clonacion=new ArrayList<Registro>();
        for(Registro e:registros){
            clonacion.add(e);
        }
        return clonacion;
    }
}
